import base64

import pickle

from django_redis import get_redis_connection
from redis import StrictRedis


def merge_cookie_cart_to_redis(request, user):
    """
    购物车合并
    当用户登录,合并未登录用户购物车数据到redis中
    如果有冲突,以cookie中为准
    合并并不是一个单独的视图,只要用户登陆成功就合并
    所以:普通账号登陆,QQ登陆都需要进行调用函数进行合并
    """
    # cookie中:
    # {
    #     sku_id: {
    #         'count': count,
    #         'selected': selected
    #     }
    # }
    # redis  hash中:
    # {
    #     'sku_id': count
    # }
    # redis set中:
    # (sku_id......)

    cookie_cart = request.COOKIES.get('cart')
    if not cookie_cart:
        return
        # 解析
    cookie_dict = pickle.loads(base64.b64decode(cookie_cart))
    if not cookie_dict:
        return

    # 准备合并到set中的数据
    cookie_selected = []  # cookie中选中的sku_id,需要添加到set中
    cookie_rem = []  # cookie中没有选中的sku_id,需要从set中移除

    # 合并到哈希中的数据
    cart = {}
    for sku_id, dict_data in cookie_dict.items():
        cart[sku_id] = dict_data['count']
        if dict_data['selected']:
            # 选中的
            cookie_selected.append(sku_id)
        else:
            # 未选中的
            cookie_rem.append(sku_id)
    # 进行合并
    conn = get_redis_connection('cart')  # type: StrictRedis

    key = 'cart_%s' % user.id
    # 合并到hash中
    if cart:
        conn.hmset(key, cart)
    selected_key = 'selected_%s' % user.id
    # 合并到set中
    if cookie_selected:
        conn.sadd(selected_key, *cookie_selected)
    if cookie_rem:
        # 移除cookie中没有的
        conn.srem(selected_key, *cookie_rem)
